/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Util;

import java.awt.Graphics2D;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
import spaceinvaders.Func;

/**
 * Conjunto de aliens
 * @author Lucas
 */
public class Aliens implements Drawable {
    //Conjunto de aliens
    Vector<Alien> aliens;
    //Aliens temporários para percorrer o vetor
    Object[] a;
    Alien al;
    //Os tiros da nave
    Vector<Tiro> tiros;
    Object[] t;
    Tiro ti;
    //Os tiros dos aliens
    Vector<TiroAlien> tiroal;
    Object[] tal;
    TiroAlien ta;
    //Parte funcional do jogo
    Func f;
    //Nível dos aliens e frequência com que atiram
    int nivel, frequencia;
    //Timer para controle dos tiros dos aliens
    Timer tiroCtrl;

    public Aliens(Vector<Tiro> tiros, Func f) {
        this.tiros = tiros;
        this.f = f;
        tiroCtrl = new Timer();
        tiroal = new Vector<TiroAlien>();
        nivel = 1;
    }

    public Vector<TiroAlien> getTiroal() {
        return tiroal;
    }

    public void setNivel(int nivel) {
        this.nivel = nivel;
    }

    public final void reset() {
        tiroal.clear();
        aliens = new Vector<Alien>(55);
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 5; j++) {
                aliens.add(new Alien("Alien", i, j));
            }
        }
        tiroCtrl.inicia();
        frequencia = 1000;
    }

    public void update() {
        //Atualiza os aliens, checando se um deles foi atingido por um tiro da nave
        a = aliens.toArray();
        for (Object o : a) {
            al = (Alien) o;
            al.update();
            t = tiros.toArray();
            for (Object ot : t) {
                ti = (Tiro) ot;
                if (ti.getRect().intersects(al.getRect())) {
                    f.aumentaPontos(100 - (al.getY() + Alien.staticy) / 3);
                    al.parar();
                    aliens.remove(al);
                    tiros.remove(ti);
                }
            }
        }

        a = aliens.toArray();
        for (Object o : a) {
            al = (Alien) o;
            //Se um dos aliens chegou ao extremo da tela, inverte a velocidade e diminui suas alturas
            if (al.getX() + Alien.velocidade < 0 || al.getX() + al.getWidth() + Alien.velocidade > 640) {
                Alien.staticy += 10;
                Alien.velocidade = -Alien.velocidade;
            }
            //Se um dos aliens chegou à altura da nave, o jogado perde o jogo
            if (al.getY() + al.getHeight() > 447) {
                f.initPerdeu();
                f.getGraf().initPerdeu();
            }
        }

        //Após um certo período de tempo, sorteia-se um dos aliens para atirar
        if (tiroCtrl.tempo() >= frequencia) {
            if (!aliens.isEmpty()) {
                al = aliens.get((int) (Math.random() * aliens.size()));
                TiroAlien temp = new TiroAlien("Tiroalien", al.getX() + 12, al.getY() + al.getHeight() - 15);
                tiroal.add(temp);
                tiroCtrl.inicia();
            }
        }

        //Atualiza os tiros que estão na tela
        tal = tiroal.toArray();
        for (Object ot : tal) {
            ta = (TiroAlien) ot;
            ta.update();
            if (ta.getY() > 480) {
                tiroal.remove(ta);
            }
        }

        //Se não há mais aliens, verifica-se o nível
        if (aliens.isEmpty()) {
            nivel++;
            //Se o nível for 1 ou 2, gera-se um novo conjunto de aliens mais rápidos e que atiram com mais frequência
            if (nivel < 4) {
                Alien.staticy = 0;
                Alien.velocidade = 1 + 2 * nivel;
                try {
                    Thread.sleep(200);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Aliens.class.getName()).log(Level.SEVERE, null, ex);
                }
                reset();
                frequencia = 1000 / nivel;
            //Caso contrário, o jogador ganhou o jogo
            } else {
                f.initGanhou();
                f.getGraf().initGanhou();
            }
        }
    }

    @Override
    public void draw(Graphics2D g2d, JPanel jp) {
        //Desenha todos os aliens
        Object[] ali = aliens.toArray();
        Alien alien;
        for (Object o : ali) {
            alien = (Alien) o;
            alien.draw(g2d, jp);
        }
        //Desenha todos os tiros
        Object[] tiroal2 = tiroal.toArray();
        for (Object o : tiroal2) {
            TiroAlien tial = (TiroAlien) o;
            tial.draw(g2d, jp);
        }
    }
}
